/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package control;
import VO.Datos;
import VO.VariablesAmbientales;
import interfaz.InterfazPrincipal;
import java.util.*;


/**
 *
 * @author xsebastianx
 */
public class ControlReportes {  
    
    public ControlReportes(){  
        
    }
    
    public double[] getMedia(ArrayList<VariablesAmbientales> contenido){
        double[] medias, pluviosidad, presion, temperatura;
        double suma = 0;
        medias = new double[3];
        pluviosidad = new double[Datos.getContenido().size()];
        presion = new double[Datos.getContenido().size()];
        temperatura = new double[Datos.getContenido().size()];
        for (int i = 0; i < Datos.getContenido().size(); i++){
            temperatura[i] = Datos.getContenido().get(i).getMedidas().get(0).getValor();
            presion[i] = Datos.getContenido().get(i).getMedidas().get(1).getValor();
            pluviosidad[i] = Datos.getContenido().get(i).getMedidas().get(2).getValor();
        }        
        for (int i = 0; i < pluviosidad.length; i++) {
            suma += pluviosidad[i];
            }
        medias[0] = suma / pluviosidad.length;
        suma = 0;        
        for (int i = 0; i < presion.length; i++) {
            suma += presion[i];
            }
        medias[1] = suma / presion.length;
        suma = 0;        
        for (int i = 0; i < temperatura.length; i++) {
            suma += temperatura[i];
            }
        medias[2] = suma / temperatura.length;
        return medias;
    }
    
    public double[] getVarianza(ArrayList<VariablesAmbientales> contenido){
        
        double[] medias = getMedia(contenido);
        double[] varianzas, pluviosidad, presion, temperatura;
        varianzas = new double[3];
        pluviosidad = new double[Datos.getContenido().size()];
        presion = new double[Datos.getContenido().size()];
        temperatura = new double[Datos.getContenido().size()]; 
        double suma = 0;
        for (int i = 0; i < contenido.size(); i++){
            temperatura[i] = Datos.getContenido().get(i).getMedidas().get(0).getValor();
            presion[i] = Datos.getContenido().get(i).getMedidas().get(1).getValor();
            pluviosidad[i] = Datos.getContenido().get(i).getMedidas().get(2).getValor();
        } 
        for (int i = 0; i < pluviosidad.length; i++) {
            suma += Math.pow((pluviosidad[i] - medias[0]),2);
            }
        varianzas[0] = suma / pluviosidad.length;
        suma = 0;        
        for (int i = 0; i < presion.length; i++) {
            suma += Math.pow((presion[i] - medias[1]),2);
            }
        varianzas[1] = suma / presion.length;
        suma = 0;        
        for (int i = 0; i < temperatura.length; i++) {
            suma += Math.pow((temperatura[i] - medias[2]),2);
            }
        varianzas[2] = suma / temperatura.length;
        return varianzas;
    }
    
    public double[] getMediana(ArrayList<VariablesAmbientales> contenido){
        
        double[] medianas, pluviosidad, presion, temperatura;
        medianas = new double[3];
        pluviosidad = new double[Datos.getContenido().size()];
        presion = new double[Datos.getContenido().size()];
        temperatura = new double[Datos.getContenido().size()]; 
        
        for(int i = 0;i < contenido.size();i++){
            temperatura[i] = Datos.getContenido().get(i).getMedidas().get(0).getValor();
            presion[i] = Datos.getContenido().get(i).getMedidas().get(1).getValor();
            pluviosidad[i] = Datos.getContenido().get(i).getMedidas().get(2).getValor();
        }
        medianas[0] = calcular(pluviosidad, 0.50);
        medianas[1] = calcular(presion, 0.50);
        medianas[2] = calcular(temperatura, 0.50);
        return medianas;
    }

    public double[] getDesviacion(ArrayList<VariablesAmbientales> contenido){
        double[] desviaciones = new double[3];
        double[] varianzas = getVarianza(contenido);
        for (int i = 0; i < 3; i++){
            desviaciones[i] = Math.sqrt(varianzas[i]);
        }
        return desviaciones;
    }
    
    public double[] getModa(ArrayList<VariablesAmbientales> contenido) {
        
        double[] pluviosidad, presion, temperatura;
        double[] modas = {0.0,0.0,0.0};
        pluviosidad = new double[Datos.getContenido().size()];
        presion = new double[Datos.getContenido().size()];
        temperatura = new double[Datos.getContenido().size()];
        
        for(int i=0;i<contenido.size();i++){
            temperatura[i] = Datos.getContenido().get(i).getMedidas().get(0).getValor();
            presion[i] = Datos.getContenido().get(i).getMedidas().get(1).getValor();
            pluviosidad[i] = Datos.getContenido().get(i).getMedidas().get(2).getValor();
        }
        
        HashMap<Double,Double> freqst = new HashMap();
        HashMap<Double,Double> freqspl = new HashMap();
        HashMap<Double,Double> freqsp = new HashMap();
        for (double d: temperatura) {
            Double freq = freqst.get(d);
            freqst.put(d, (freq == null ? 1 : freq + 1));   
        }
        double maxFreq = 0;    
        for (Map.Entry<Double,Double> entry : freqst.entrySet()) {     
             double freq = entry.getValue();
             if (freq > maxFreq) {
                 maxFreq = freq;
                 modas[0] = entry.getKey();
             }
        } 
               
        for (double d: pluviosidad) {
            Double freq = freqspl.get(d);
            freqspl.put(d, (freq == null ? 1 : freq + 1));   
        }
        maxFreq = 0;    
        for (Map.Entry<Double,Double> entry : freqspl.entrySet()) {     
             double freq = entry.getValue();
             if (freq > maxFreq) {
                 maxFreq = freq;
                 modas[1] = entry.getKey();
             }
        }
              
        for (double d: presion) {
            Double freq = freqsp.get(d);
            freqsp.put(d, (freq == null ? 1 : freq + 1));   
        }
        maxFreq = 0;    
        for (Map.Entry<Double,Double> entry : freqsp.entrySet()) {     
             double freq = entry.getValue();
             if (freq > maxFreq) {
                 maxFreq = freq;
                 modas[2] = entry.getKey();
             }
        }
        return modas;
    }
        
    public String[] getRango(ArrayList<VariablesAmbientales> contenido) {
        
        double[] pluviosidad, presion, temperatura;
        String[] rangos = new String[3];
        pluviosidad = new double[Datos.getContenido().size()];
        presion = new double[Datos.getContenido().size()];
        temperatura = new double[Datos.getContenido().size()];
        
        for(int i = 0;i < contenido.size();i++){
            temperatura[i] = Datos.getContenido().get(i).getMedidas().get(0).getValor();
            presion[i] = Datos.getContenido().get(i).getMedidas().get(1).getValor();
            pluviosidad[i] = Datos.getContenido().get(i).getMedidas().get(2).getValor();
        }
        rangos[0] = (String.valueOf(calcular(pluviosidad, 0.25))) +" - "+ (String.valueOf(calcular(pluviosidad, 0.75)));
        rangos[1] = (String.valueOf(calcular(presion, 0.25))) +" - "+ (String.valueOf(calcular(presion, 0.75)));
        rangos[2] = (String.valueOf(calcular(temperatura, 0.25))) +" - "+ (String.valueOf(calcular(temperatura, 0.75)));

        return rangos;
    } 
    
    public double calcular(double[] datos, double n){        
        double[] rango = new double[2];
        rango[0] = datos[0];
        rango[1] = datos[0];
        for (int i = 1; i < datos.length; i++) {
              if (datos[i] < rango[0]) rango[0] = datos[i];
              if (datos[i] > rango[1]) rango[1] = datos[i];
        }
        int numclases = (int)Math.ceil(Math.sqrt((double)datos.length));
        double k = (rango[1]-rango[0]) / numclases;
        double intervalo = -10;
        TreeMap absFreqs = new TreeMap();
        absFreqs.put(rango[0], 0);
        for (double i = rango[0] + k;i <= rango[1];i += k){
            int suma = 0;
            for (int j = 0;j < datos.length;j++){
                if (datos[j] <= i) suma += 1;
            }
            absFreqs.put(i, suma);
            if (intervalo == -10 && (datos.length * n) <= suma) intervalo = i;
        }
        double medida;
        double freq, partsup;
        freq =  (((Integer)absFreqs.get(intervalo)) - ((Integer)absFreqs.get(intervalo - k)));
        partsup = ((datos.length) * n) - ((Integer)absFreqs.get(intervalo - k));
        medida = (intervalo - k) + ((k * partsup) / freq);
        return medida;
    }
}
